package com.example.demo.delay;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * <p>
 *  KafkaDelayListener注解用于启动消费者线程来延迟消费kafka消息
 *  方法内只需要关心消息的处理逻辑即可，如果关闭了自动提交则还需要在方法中控制消费位移的提交。
 *  该注解提供了三个可配置参数，topic，delayTimeSec 和 pauseTimeSec。
 *  topic 表示消费者需要订阅队列。
 *  delayTimeSec则是从消息产生到消费之间需要等待的时间，即延时消息的延迟时间。
 *  这里可以看到延迟时间是配置到消费者端的，所以该延迟消息投递后消费者是一直可见的，这与rabbitmq的实现有着很大的不同。
 *  pauseTimeSec则是kafka消费者发现当前无延迟消息到期时主动paus的时间。
 *  (tips：kafkaConsumer pause后只是不拉取消息，心跳线程不会受到影响，不会引发分区重分区)
 * </p>
 *
 * @author liuzaihuan
 * @date 2021/12/9 16:58
 * @desc 启动消费者线程来延迟消费kafka消息
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface KafkaDelayListener {

    /**
     * 渠道名称
     *
     * @return
     */
    String channelName();

    /**
     * 主题
     *
     * @return
     */
    String topic();

    /**
     * 延迟消费的时间,单位毫秒
     *
     * @return
     */
    int delayTimeSec() default 120;

    /**
     * 消费者pause时间,单位毫秒
     *
     * @return
     */
    int pauseTimeSec() default 2;


    /**
     * 消费重试次数
     *
     * @return
     */
    int retryTimes() default 3;

}
